Swadhin Biswas Feature/ai code reviewer (#73) · 8/2/2026
105a287
46 lines · 1.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import { getDatabase, schema } from "@/db";
import type { NodePgDatabase } from "drizzle-orm/node-postgres";
import { personalAccessTokens } from "@/db/schema";
import {
    badRequest,
    notFound,
    success,
    unauthorized,
} from "@/lib/api";
import { getUserFromRequest } from "@/lib/auth";
import type { APIRoute } from "astro";
import { and, eq } from "drizzle-orm";

import { withErrorHandler } from "@/lib/errors";
import { logger } from "@/lib/logger";

export const DELETE: APIRoute = withErrorHandler(async ({ request, params }) => {
    const { id } = params;
    if (!id) return badRequest("Missing ID");

    const tokenPayload = await getUserFromRequest(request);
    if (!tokenPayload) {
        return unauthorized();
    }

    const db = getDatabase() as NodePgDatabase<typeof schema>;

    // Verify ownership
    const token = await db.query.personalAccessTokens.findFirst({
        where: and(
            eq(personalAccessTokens.id, id),
            eq(personalAccessTokens.userId, tokenPayload.userId)
        ),
    });

    if (!token) {
        return notFound("Token not found");
    }

    await db.delete(personalAccessTokens).where(eq(personalAccessTokens.id, id));

    logger.info({ userId: tokenPayload.userId, tokenId: id }, "Personal Access Token deleted (legacy endpoint)");

    return success({ message: "Token deleted" });
});